/*
 * GDevelop Core
 * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
 * reserved. This project is released under the MIT License.
 */
/**
 * @file Tests covering common features of GDevelop Core.
 */
#include "GDCore/Events/Parsers/VariableParser.h"
#include "GDCore/String.h"
#include "catch.hpp"

namespace {
class TestVariableParserCallbacks : public gd::VariableParserCallbacks {
 public:
  TestVariableParserCallbacks(gd::String &debugStr)
      : VariableParserCallbacks(), debugStr(debugStr) {}

  virtual void OnRootVariable(gd::String variableName) {
    debugStr += "OnRootVariable(" + variableName + ")\n";
  }

  virtual void OnChildVariable(gd::String variableName) {
    debugStr += "OnChildVariable(" + variableName + ")\n";
  }

  virtual void OnChildSubscript(gd::String stringExpression) {
    debugStr += "OnChildSubscript(" + stringExpression + ")\n";
  }

 private:
  gd::String &debugStr;
};
}  // namespace

TEST_CASE("VariableParser", "[common][events]") {
  SECTION("Basics") {
    {
      gd::String str;
      TestVariableParserCallbacks callbacks(str);
      gd::VariableParser parser("myVar");
      parser.Parse(callbacks);

      REQUIRE(str == "OnRootVariable(myVar)\n");
    }
    {
      gd::String str;
      TestVariableParserCallbacks callbacks(str);
      gd::VariableParser parser("myVar.child1.child2");
      parser.Parse(callbacks);

      REQUIRE(str ==
              "OnRootVariable(myVar)\nOnChildVariable(child1)\nOnChildVariable("
              "child2)\n");
    }
    {
      gd::String str;
      TestVariableParserCallbacks callbacks(str);
      gd::VariableParser parser("myVar[ToString(i) + \"é\"].child");
      parser.Parse(callbacks);

      REQUIRE(str ==
              "OnRootVariable(myVar)\nOnChildSubscript(ToString(i) + "
              "\"é\")\nOnChildVariable(child)\n");
    }
  }
}
